/*自身对应的.h文件*/
#include "app_sensor_data_struct.h"

/*程序内部对应的.h文件*/
#include "log.h"

/*外部库对应的.h文件*/

/*系统.h文件*/
#include <string.h>
#include <stdbool.h>
#include <malloc.h>

struct _sensor_data_t
{
	time_t date;
	char sn[11];
	sensor_type_t type;
	float data;
};

const char* type_to_str[] = {
	[CO2] = "CO2",
	[O2] = "O2",
	[TEMP] = "TEMP",
	[ERR_TYPE] = "ERR_TYPE",
};

/***************************************************************
 * Name:	 sensor_data_type_to_str()
 * Input : type 数据类型 
 * Output: str 类型转换的字符串 char[10]
 * Return: 0成功 -1失败
 * Author: hwl
 * Revise: V1.0
 * Description: 数据类型转换为字符串
 ***************************************************************/
int sensor_data_type_to_str(sensor_type_t type, char* str)
{
	if(str == NULL)
	{
		return -1;
	}
	
	if (TYPE_VAILD(type) == true)
	{
		strcpy(str, type_to_str[type]);
		return 0;
	}
	else
	{
		strcpy(str, type_to_str[ERR_TYPE]);
		return -1;
	}
}

/***************************************************************
 * Name:	 sensor_data_str_to_type()
 * Input : str 类型转换的字符串 type 字符串转换的数据类型
 * Output: void
 * Return: 0成功 -1失败
 * Author: hwl
 * Revise: V1.0
 * Description: 字符串转换为数据类型
 ***************************************************************/
int sensor_data_str_to_type(const char* str, sensor_type_t* type)
{
	if(str == NULL || type == NULL)
	{
		return -1;
	}

	*type = ERR_TYPE;

	for(int i = TYPE_START + 1; i < TYPE_END; i++)
	{
		int len = strlen(type_to_str[i]) > strlen(str) ?
								strlen(str) :
								strlen(type_to_str[i]);
		if(strncmp(str, type_to_str[i], len) == 0)
		{
			*type = i;
			return 0;
		}
	}

	return -1;
}

/***************************************************************
 * Name:	 sensor_data_size()
 * Input : void
 * Output: void
 * Return: 数据结构体需要的内存大小
 * Author: hwl
 * Revise: V1.0
 * Description: 数据结构体需要的内存大小
 ***************************************************************/
size_t sensor_data_size(void)
{
	return sizeof(sensor_data_t);
}

/***************************************************************
 * Name:	 sensor_data_size()
 * Input : list_head 队列指针头 item 队列第几项
 * Output: void
 * Return: 该项对应的地址指针
 * Author: hwl
 * Revise: V1.0
 * Description: 队列项对应的地址指针
 ***************************************************************/
sensor_data_t* sensor_data_list_col(sensor_data_t* list_head, size_t item)
{
	return &list_head[item];
}

/***************************************************************
 * Name:	 sensor_data_create()
 * Input : sn 数据的SN号 type 数据的类型 data 数据的数据值
 * Output: void
 * Return: !=NULL 生成的数据结构体
 * Author: hwl
 * Revise: V1.0
 * Description: 生成数据结构体
 ***************************************************************/
sensor_data_t* sensor_data_create(const char* sn, const sensor_type_t type, const float data)
{
	if (sn == NULL)
	{
		return NULL;
	}

	sensor_data_t* sensor = malloc(sizeof(sensor_data_t));
	if (sensor)
	{
		sensor_data_set_cur_date(sensor);
		sensor_data_set_sn(sensor, sn);
		sensor_data_set_type(sensor, type);
		sensor_data_set_data(sensor, data);
	}

	return sensor;
}

/***************************************************************
 * Name:	 sensor_data_destroy()
 * Input : data 生成的数据类型内存
 * Output: void
 * Return: void 
 * Author: hwl
 * Revise: V1.0
 * Description: 销毁数据结构体
 ***************************************************************/
void  sensor_data_destroy(sensor_data_t* data)
{
	if (data != NULL)
	{
		free(data);
	}
}

/***************************************************************
 * Name:	 sensor_data_printf()
 * Input : data 生成的数据类型内存
 * Output: void
 * Return: void 
 * Author: hwl
 * Revise: V1.0
 * Description: 打印数据结构体
 ***************************************************************/
void sensor_data_printf(const sensor_data_t* sensor)
{
	if (sensor == NULL)
	{
		LOG_ERROR("sensor = NULL\n");
		return;
	}

	char buf[100] = "";
	memset(buf, 0x00, sizeof(buf));
	sensor_data_get_date(sensor, buf);
	printf("DATE:%s", buf);

	memset(buf, 0x00, sizeof(buf));
	sensor_data_get_sn(sensor, buf);
	printf(" sn:%s", buf);

	sensor_type_t type;
	sensor_data_get_type(sensor, &type);
	char type_str[10];
	sensor_data_type_to_str(type, type_str);
	printf(" TYPE:%s", type_str);
	
	float data;
	sensor_data_get_data(sensor, &data);
	printf(" DATA:%.2f", data);

	printf(" \n");
}

/***************************************************************
 * Name:	 sensor_data_set_cur_date()
 * Input : sensor 数据结构体
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置数据的时间
 ***************************************************************/
void sensor_data_set_cur_date(sensor_data_t* sensor)
{
	if (sensor == NULL)
	{
		return;
	}
	
	time(&sensor->date);
}

/***************************************************************
 * Name:	 sensor_data_set_custom_date()
 * Input : sensor 数据结构体 data 时间字符串 char[20] "2025-03-04 14:22:00"
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置数据的时间
 ***************************************************************/
void sensor_data_set_custom_date(sensor_data_t* sensor, time_t date)
{
	if (sensor == NULL)
	{
		return;
	}
	
	sensor->date = date;
}

/***************************************************************
 * Name:	 sensor_data_set_sn()
 * Input : sensor 数据结构体 sn 设置的SN号 char[11]
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置传感器数据的SN号
 ***************************************************************/
void sensor_data_set_sn(sensor_data_t* sensor, const char* sn)
{
	if (sensor == NULL)
	{
		return;
	}
	
	memcpy(sensor->sn, sn, sizeof(sensor->sn));
}

/***************************************************************
 * Name:	 sensor_data_set_type()
 * Input : sensor 数据结构体 type 设置的类型
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置传感器数据的类型
 ***************************************************************/
void sensor_data_set_type(sensor_data_t* sensor, const sensor_type_t type)
{
	if (sensor == NULL)
	{
		return;
	}
	
	sensor->type = type;
}

/***************************************************************
 * Name:	 sensor_data_set_sn()
 * Input : sensor 数据结构体 data 设置的数据
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 设置传感器数据的数据
 ***************************************************************/
void sensor_data_set_data(sensor_data_t* sensor, const float data)
{
	if (sensor == NULL)
	{
		return;
	}
	
	sensor->data = data;
}

/***************************************************************
 * Name:	 sensor_data_set_type()
 * Input : sensor 数据结构体 date 存储时间字符串的空间 char[20]
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的时间
 ***************************************************************/
void sensor_data_get_date(const sensor_data_t* sensor, char* date)
{
	if (sensor == NULL || date == NULL)
	{
		return;
	}

	struct tm time_info;

	// 转换为本地时间（线程安全）
	localtime_r(&sensor->date, &time_info);
	
	// 自定义格式：包含年月日时分秒
	strftime(date, 20, "%Y-%m-%d %H:%M:%S", &time_info);
}

/***************************************************************
 * Name:	 sensor_data_get_sn()
 * Input : sensor 数据结构体 sn 存储SN号字符串的空间 char[11]
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的SN号
 ***************************************************************/
void sensor_data_get_sn(const sensor_data_t* sensor, char* sn)
{
	if (sensor == NULL || sn == NULL)
	{
		return;
	}
	memcpy(sn, sensor->sn, sizeof(sensor->sn));
}

/***************************************************************
 * Name:	 sensor_data_get_sn()
 * Input : sensor 数据结构体 sn 存储SN号字符串的空间 
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的SN号
 ***************************************************************/
void sensor_data_get_type(const sensor_data_t* sensor, sensor_type_t* type)
{
	if (sensor == NULL || type == NULL)
	{
		return;
	}
	
	*type = sensor->type;
}

/***************************************************************
 * Name:	 sensor_data_get_sn()
 * Input : sensor 数据结构体 sn 存储SN号字符串的空间 
 * Output: void
 * Return: void
 * Author: hwl
 * Revise: V1.0
 * Description: 获取传感器数据的SN号
 ***************************************************************/
void sensor_data_get_data(const sensor_data_t* sensor, float* data)
{
	if (sensor == NULL || data == NULL)
	{
		return;
	}
	
	*data = sensor->data;
}